package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * IO流---传对象---高级流
 * ObjectOutputStream      对象输出流---写操作
 * ObjectInputStream       对象输入流---读操作
 * 使用方式：1.创建实现序列化接口的对象
 */

public class ObjectIO {
    /**
     * ObjectOutputStream   对象输出流
     * 使用方式:1.创建实现序列化接口的对象
     *        2.对象输出流---xxx.obj文件
     *                     传输对象，指定格式obj
     */
    @Test
    public void testOOS() throws IOException {
        //1.创建Person对象
        Person p=new Person();
        p.setName("韩美娟");
        //数组--动态数组
        //String srt={"1","2","3"};   静态动态数组
        //String[] str=new String{"1"};
        p.setSay(new String[]{"白银必有果"});
        System.out.println("打印对象："+p);

        //对象输出写出文件   xxx.obj   Person.java
        FileOutputStream fos=
                new FileOutputStream("person.obj");
        ObjectOutputStream oos=new ObjectOutputStream(fos);
        /**
         * writeObject(Object obj)   ----理解：写出对象
         * 该方法会将给定对象按照其结构进行转换
         * 转换为一组“组”字节，在通过其处理的流写出
         *
         * NotSerializable 删掉，测试对象输出流是否正常写出
         * 原因：写出类没有实现序列化接口
         *
         * 写出文件专业术语
         * 1.通过对象输出流将Person类，先转换为一组“组”字节，这个过程【对象序列化】
         * 2.将序列化后的字节在通过字节流【低级流】写入文件中【硬盘上】做长久保存，
         * 这个过程【数据持久化】
         * 将person.obj持久化保存到硬盘上
         */
        oos.writeObject(p);
        System.out.println("写出成功啦~~");

    }

/**
 * ObjectInputStream      对象输入流
 * 序列化：将对象转换为二进制
 * 反序列化：二进制转换为对象
 * readObject()  返回读取的对象【？】
 * 需求：将序列化person.obj文件   按照对象的方式来进行读入
 */
@Test
public void testOIS(){
    //创建低级流
    FileInputStream fis=null;
    //创建高级流--对象读入
    ObjectInputStream ois=null;
    //readObject()  获取对象【反序列化操作，
    // 二进制转换为对象】
    try{
        fis=new FileInputStream("person.obj");
        ois=new ObjectInputStream(fis);
        System.out.println(ois.readObject());
        System.out.println("反序列化成功");
    }catch (ClassNotFoundException e){
        e.printStackTrace();
    }catch (IOException e){
        e.printStackTrace();
    }finally {
        if (ois!=null)
            try {
                ois.close();
            }catch (IOException e){
                e.printStackTrace();
            }
    }
}
}
